Harden review workflows and deliver comments in FIFO order - #8
Open
DeyangChan wants to merge 9 commits into
Open
Harden review workflows and deliver comments in FIFO order#8DeyangChan wants to merge 9 commits into
DeyangChan wants to merge 9 commits into
Conversation
The workspace escaped & < and > but not quotes, while most of what it builds is an HTML attribute — so a quote in a reviewer's own words ended the attribute early. The story map and the build board escape the ids they interpolate for the same reason. A saved comment's fields were copied across by name, so a name like __proto__ reached the prototype instead of the object. The update check kept its cache at a fixed path in the shared temp directory, which another account on the machine can create first. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…acket Copying the payload's fields onto the stored comment one name at a time let a name like __proto__ reach the prototype, and a blocklist still leaves the write arbitrary. The unsent draft is now rebuilt by spread, which creates own properties and follows no setter. An end tag carries anything up to its `>` — `</script foo >` closes a script — so the phase-preview patterns read to the bracket. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Both report now: the security workflow passes on main, and the Scorecard badge renders a score rather than the invalid-repo-path error it used to. The two Sonar badges stay hidden — Sonar has not analysed the repository since v5.0.0, so the gate is not computed and the rating is stale. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Installing from this clone as a local marketplace, which is how the plugin is tested before it ships, leaves a .orphaned_at timestamp inside plugins/vstack/. It belongs to that machine's install, not to the plugin. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Both scroll steps scrolled once and then polled for the result. Until the page under review has laid out there is nothing to scroll, and a scroll made at that moment is dropped rather than queued — so an attempt that lost the race could never recover, and the step failed for its full timeout instead of retrying. Against a box that becomes scrollable after 800ms, the old shape fails after the whole 5s budget and the new one passes at 866ms. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Both scroll steps ran before the workspace had sized the frame to the page it had loaded. There was nothing to scroll yet, and a scroll made then is dropped rather than queued, so the step failed for its whole timeout. They now wait for the size the workspace sets once the framed page has loaded, then scroll and confirm they reached the bottom rather than merely moved. Stopping at the first movement leaves the target part way up the canvas, where the click that follows cannot reach it. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
The review server owns a single active FIFO slot. A question releases that slot, and the answered thread returns to the queue without interrupting the comment already in progress. Codex uses bounded pull and claim delivery while Claude and Grok retain push delivery under the same queue semantics.
A pull Host's review loop continues only while the agent keeps calling the bounded wait, and every exit from that loop was silent about it. The wait returned `IDLE` after 25 seconds and said nothing further; a claim reported the round it handed over and nothing further. Nothing was left running to notice the calls had stopped, so the lease aged out, the workspace went Unlinked, and the comments the reviewer kept sending sat undelivered. Each of those exits now prints the command that resumes the wait, which is what the one-shot push form has always done. Arguments are quoted, so a page under a path with a space survives being copied back out. `unanswered` was the check that should have caught it and instead confirmed the mistake: with nothing ever delivered, it reported that every comment was closed or answered. It now names a live review that has comments waiting with no watcher behind it, and gives the command that starts watching again. It stays quiet while a pull lease is fresh, so the ordinary gap between calls is not reported as a fault, and its exit code is unchanged — only a round this session was handed and left unanswered blocks a turn, as rule 14 says. The lifecycle suite now runs from a directory whose name contains a space, which is what caught the quoting. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Codex has no background monitor tool, so the review loop is driven by bounded polling rather than a push watcher. Someone choosing a host should know that before they install. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What this changes
This PR contains every change currently on
fix/code-scanning-findingsand not onmain. It ships Visual Stack 6.7.0 across the Claude and Codex manifests.IDLEreturned after 25 seconds, and a claim reported its round, while nothing was left running to notice the calls had stopped. Comments then sat undelivered behind an expired lease. Each exit now prints the quoted command that resumes the wait, as the one-shot push form already did.unansweredreporting all-clear over a review nobody is watching. With nothing ever delivered it confirmed that every comment was closed or answered, which is the check an agent runs before ending a turn. It now names a live review with comments waiting and no watcher behind it, stays quiet while a pull lease is fresh, and leaves its exit code alone — only a round this session was handed and left unanswered blocks a turn, per rule 14.How it was tested
node plugins/vstack/skills/review/tests/review-lifecycle.mjs, now run from a directory whose name contains a space, which is what caught the argument quoting in the resume commandsnode plugins/vstack/skills/review/tests/round-gate.mjsVSTACK_HOST=claudeandVSTACK_HOST=codexgit diff --checkChecklist
unanswered. Automated host E2E covers the rest.mainand resolved here.Not applicable: no plugin or tool was added or renamed, and no workflow action was added.